/**
 *
 */
package jp.takapy.baycity.logic;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;

import jp.takapy.baycity.util.XMLUtils;

import org.ccil.cowan.tagsoup.Parser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import android.widget.Toast;

/**
 * Htmlを解析し時刻表データを切り出す
 * @author Takapy
 *
 */
public class ParseHtmlToData {

	/***************変数*********************/
	private static String TAG = "BaycityBusApp";

	private String url;
	private String encoding = "Shift-JIS";
	private int FIRST_DIST_TITLE = 0;
	private int FIRST_DIST_DAYDATA = 1;
	private int FIRST_DIST_HOLIDAYDATA = 2;
	private int SECOND_DIST_TITLE = 3;
	private int SECOND_DIST_DAYDATA = 4;
	private int SECOND_DIST_HOLIDAYDATA = 5;


	/**************コンストラクタ************/
	/**
	 * コンストラクタ
	 * @param url
	 */
	public ParseHtmlToData(String url) {
		this.url = url;
	}

	/**************メソッド******************/


	/**
	 * HTML解析処理を呼び出し、時刻表データ更新を呼び出すメソッド
	 * @return
	 */
	public boolean updateTimeTableData() {;

		try {
			//URLのページからHTMLドキュメントを取得
			Document document = parse(url, encoding);

			//HTMLをStringに変換
			String html = htmlToString(document);

			//tableタグのNodeリストを取得
			NodeList nl = document.getElementsByTagName("table");
			//2方面目の有無を判定するためにNode数を取得
			int maches = nl.getLength();

			//アップデートを実行
			doUpdateTimeTable(nl);


		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return true;
	}


	/**
	 * HTMLドキュメントオブジェクトをStringに変換する
	 * @param document
	 * @return
	 */
	public String htmlToString(Document document) {
		return  XMLUtils.document2String(document);
	}

	/**
	 * HTML解析メソッド
	 * @param url
	 * @param encoding
	 * @return
	 * @throws IOException
	 */
	public  Document parse(String url, String encoding)
			throws IOException {

		if (url == null || url.length() == 0) {
			throw new IllegalArgumentException("urlがnullか空です");
		}

		if (encoding == null || encoding.length() == 0) {
			throw new IllegalArgumentException("encodingがnullか空です");
		}

		InputStream stream = null;
		try {
			stream = new URL(url).openStream();

			InputSource source = new InputSource(stream);
			source.setEncoding(encoding);

			try {
				XMLReader reader = new Parser();
				reader.setFeature(Parser.namespacesFeature, false);
				reader.setFeature(Parser.namespacePrefixesFeature, false);

				Transformer transformer = TransformerFactory.newInstance()
						.newTransformer();

				DOMResult result = new DOMResult();
				transformer.transform(new SAXSource(reader, source), result);

				return (Document) result.getNode();

			} catch (SAXException e) {

				// Parser.setFeatureは失敗しないはず。
				throw new RuntimeException(e);

			} catch (TransformerException e) {

				// これに失敗してるようではどうしようもない。
				throw new RuntimeException(e);
			}

		} finally {
			if (stream != null) {
				stream.close();
			}
		}
	}


	private void doUpdateDistTitle(NodeList nl, int no) {

    	Element dirElement = (Element) nl.item(no);
    	//行き先名のあるtableで"b"タグがあるのは行き先表示しているとこだけ
    	String dir = getElementContent(dirElement, "b");

    	//行き先の更新実行
	}


	private void doUpdateDistData(NodeList nl, int no) {

	}


	/**
	 * アイテム要素から各子要素の内容を取り出す
	 * @param e
	 * @param TagName
	 * @return
	 */
	private String getElementContent(Element e, String TagName) {

	//タグ名からNodeList取得
	NodeList nl = e.getElementsByTagName(TagName);
	//1番目のNodeを取得
	Node n = nl.item(0);
	//さらに子Nodeを取得
	Node content = n.getFirstChild();
	//子Nodeの値を返却する
	return content.getNodeValue();
	}
}
